package com.distribuida.servidor;
import java.util.ArrayList;

import com.distribuida.supertrunfo.comum.Jogador;
import com.distribuida.supertrunfo.impl.Jogo;
import com.distribuida.supertrunfo.impl.SuperTrunfo;


public class Servidor {

    private static Servidor instance;
    public ArrayList<Jogo> jogos;
    public ArrayList<Jogador> jogadores;
    private static String caminhoXML = "C:\\Users\\09100313\\Downloads\\arvores_brasileiras.xml";
    public int porta = 1099;
    private int ultimoJogoDisponivel = 0;

    protected Servidor() {
        super();
	jogos = new ArrayList<Jogo>();
        jogadores = new ArrayList<Jogador>();
    }

    public static Servidor getInstance() {
        if(instance == null){
            try {
                instance = new Servidor();
            } catch(Exception e){
                e.printStackTrace();
            }
	}
        return instance;
    }

    public ArrayList<Jogo> getJogos() {
        return jogos;
    }

    public void setJogos(ArrayList<Jogo> jogos) {
        this.jogos = jogos;
    }

    public Jogo getJogoPorId(int id) throws Exception {
        for(Jogo jogo : jogos) {
            if(jogo.getId() == id) {
                return jogo;
            }
	}
	throw new Exception("Jogo inexistente!");
    }

    public Jogo BuscarJogoDisponivel() {
        Jogo jogo = null;
	for(Jogo jog : jogos) {
            if(jog.getJogadores().size() < 4 && !jog.isJogoEmAndamento()) {
                jogo = jog;
            }
	}
        if(jogo == null) {
            jogo = new Jogo(new SuperTrunfo(caminhoXML));
            jogos.add(jogo);
            ultimoJogoDisponivel = jogos.indexOf(jogo);
	}
        return jogo;
    }
	
    public int RegistroJogador(String nome) throws Exception {
        Jogador jog = buscarJogadorPorNome(nome);
        if(jog == null) {
            System.out.println("Jogador sem o pre registro!");
            return -1;
        } else {
            Jogo jogo = BuscarJogoDisponivel();
            if(jogo.adicionarJogador(jog))
                return jog.getId();
            else
                return -1;
        }
    }
	
    public int preRegistroJogador(String nome, int id) {
        if(buscarJogadorPorNome(nome) != null){
            System.out.println("Ja existe um usuario com este nome!");
            return -1;
	}
        Jogador jogador = new Jogador(nome, id);
	jogadores.add(jogador);
	return 0;
    }
	
    public int removerJogador(int id) throws Exception{
        return getJogoPorId(buscarJogadorPorID(id).getId_jogo()).removerJogador(id) && jogadores.remove(buscarJogadorPorID(id))? 0:-1;
    }
	
    public Jogador buscarJogadorPorNome(String nome){
        Jogador jog = null;
	for(Jogador joga: jogadores){
            if(joga.getNome().equalsIgnoreCase(nome)){
                jog = joga;
		return jog;
            }
	}
	return jog;
    }

    public Jogador buscarJogadorPorID(int id){
        Jogador jog = null;
	for(Jogador joga: jogadores){
            if(joga.getId() == id){
                jog = joga;
		return jog;
            }
        }
	return jog;
    }	

    public int getUltimoJogoDisponivel() {
        return ultimoJogoDisponivel;
    }

    public void setUltimoJogoDisponivel(int ultimoJogoDisponivel) {
        this.ultimoJogoDisponivel = ultimoJogoDisponivel;
    }

}